/**
 * Create in 2012-4-25.
 */
package kit4j.util.lang;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * 
 * @author MiniKnife
 * 
 */
public abstract class DateUtil {

	private static class SingletonHolder {

		static DateFormat defaultFormat = DateFormat.getInstance();

		static DateFormat defaultDateFormat = DateFormat.getDateInstance();

		static DateFormat defaultTimeFormat = DateFormat.getTimeInstance();

		static DateFormat defaultDateTimeFormat = DateFormat.getDateTimeInstance();

		static DateFormat getDefaultFormat() {
			return defaultFormat;
		}

		static DateFormat getDefaultDateFormat() {
			return defaultDateFormat;
		}

		static DateFormat getDefaultTimeFormat() {
			return defaultTimeFormat;
		}

		static DateFormat getDefaultDateTimeFormat() {
			return defaultDateTimeFormat;
		}
	}

	/**
	 * 将{@link java.util.Date}对象转换为{@link java.sql.Date}对象。
	 * 
	 * @param date
	 *            要转换的{@link java.util.Date}对象
	 * @return 与指定{@link java.util.Date}对象表示同一时刻的{@link java.sql.Date}对象。
	 */
	public static java.sql.Date toSqlDate(Date date) {
		return new java.sql.Date(date.getTime());
	}

	/**
	 * 使用默认语言环境的Short风格格式化指定的日期和时间。
	 * 
	 * @param date
	 *            要格式化的时间
	 * @return 已格式化的时间字符串
	 */
	public static String format(Date date) {
		return SingletonHolder.getDefaultFormat().format(date);
	}

	/**
	 * 使用默认语言环境的默认格式化风格格式化指定的日期。
	 * 
	 * @param date
	 *            要格式化的日期
	 * @return 已格式化的日期字符串
	 */
	public static String formatDate(Date date) {
		return SingletonHolder.getDefaultDateFormat().format(date);
	}

	/**
	 * 使用默认语言环境的给定格式化风格格式化指定的日期。
	 * 
	 * @param date
	 *            要格式化的日期
	 * @param style
	 *            给定的格式化风格
	 * @return 已格式化的日期字符串
	 */
	public static String formatDate(Date date, int style) {
		return DateFormat.getDateInstance(style).format(date);
	}

	/**
	 * 使用给定语言环境的给定格式化风格格式化指定的日期。
	 * 
	 * @param date
	 *            要格式化的日期
	 * @param style
	 *            给定的格式化风格
	 * @param locale
	 *            给定的语言环境
	 * @return 已格式化的日期字符串
	 */
	public static String formatDate(Date date, int style, Locale locale) {
		return DateFormat.getDateInstance(style, locale).format(date);
	}

	/**
	 * 使用默认语言环境的默认格式化风格格式化指定的时间。
	 * 
	 * @param date
	 *            要格式化的时间
	 * @return 已格式化的时间字符串
	 */
	public static String formatTime(Date date) {
		return SingletonHolder.getDefaultTimeFormat().format(date);
	}

	/**
	 * 使用默认语言环境的给定格式化风格格式化指定的时间。
	 * 
	 * @param date
	 *            要格式化的时间
	 * @param style
	 *            给定的格式化风格
	 * @return 已格式化的时间字符串
	 */
	public static String formatTime(Date date, int style) {
		return DateFormat.getTimeInstance(style).format(date);
	}

	/**
	 * 使用给定语言环境的给定格式化风格格式化指定的时间。
	 * 
	 * @param date
	 *            要格式化的时间
	 * @param style
	 *            给定的格式化风格
	 * @param locale
	 *            给定的语言环境
	 * @return 已格式化的时间字符串
	 */
	public static String formatTime(Date date, int style, Locale locale) {
		return DateFormat.getTimeInstance(style, locale).format(date);
	}

	/**
	 * 使用默认语言环境的默认日期和时间格式化风格格式化指定的日期和时间。
	 * 
	 * @param date
	 *            要格式化的时间
	 * @return 已格式化的时间字符串
	 */
	public static String formatDateTime(Date date) {
		return SingletonHolder.getDefaultDateTimeFormat().format(date);
	}

	/**
	 * 使用默认语言环境的给定日期和时间格式化风格格式化指定的日期和时间。
	 * 
	 * @param date
	 *            要格式化的时间
	 * @param dateStyle
	 *            给定的日期格式化风格
	 * @param timeStyle
	 *            给定的时间格式化风格
	 * @return 已格式化的时间字符串
	 */
	public static String formatDateTime(Date date, int dateStyle, int timeStyle) {
		return DateFormat.getDateTimeInstance(dateStyle, timeStyle).format(date);
	}

	/**
	 * 使用给定语言环境的给定日期和时间格式化风格格式化指定的日期和时间。
	 * 
	 * @param date
	 *            要格式化的时间
	 * @param dateStyle
	 *            给定的日期格式化风格
	 * @param timeStyle
	 *            给定的时间格式化风格
	 * @param locale
	 *            给定的语言环境
	 * @return 已格式化的时间字符串
	 */
	public static String formatDateTime(Date date, int dateStyle, int timeStyle, Locale locale) {
		return DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale).format(date);
	}
}
